package linkedlist;/*

 */

import javax.xml.soap.Node;

/**
 * @ClassName Josepfu
 * @Author Final
 * @Project DataStructures
 * 环形的单项链表
 */

public class Josepfu {

    //春构建一个first节点
    private JosepfuNode first=new JosepfuNode(-1);

    /**
     * 添加数据创建环
     * @param nums
     */
    public void addNode(int nums){
        //校验
        if (nums<1){
            System.out.println("数值不正确");
            return;
        }

        /**
         * 增加
         */
        JosepfuNode curNode=null;//辅助节点
        for (int i=1;i<=nums;i++){
            //根据编号创建节点
            JosepfuNode node=new JosepfuNode(i);
            //第一个节点
            if (i==1){
                first=node;
                first.setNext(first);//构成环
                curNode=first;//指向第一个节点
            }else {
                curNode.setNext(node);
                node.setNext(first);
                curNode=node;
            }
        }
    }

    /**
     * 遍历输出
     */
    public void showNode(){
        //判断为空
        if (first==null){
            System.out.println("为空...");
            return;
        }
        //辅助节点
        JosepfuNode curNode=first;
        while (true){
            System.out.printf("节点的编号为%d \n",curNode.getNo());
            if (curNode.getNext()==first){//遍历完成
                break;
            }
            curNode=curNode.getNext();//curNode后移
        }
    }

    /**
     * 根据用户输入出队列
     * @param startNode
     * @param countNode
     * @param nums
     */
    public void countNode(int startNode,int countNode,int nums){
        //校验
        if (first==null || startNode<1 || startNode>nums){
            System.out.println("输入有误，请重新输入！");
            return;
        }
        //创建辅助节点，完成输出
        JosepfuNode helper=first;
        while (true){
            if (helper.getNext()==first){  //指向最后一个节点
                break;
            }
            helper=helper.getNext();
        }
        //先移动k-1次
        for (int i = 0; i < startNode-1; i++) {
            first=first.getNext();
            helper=helper.getNext();
        }
        while (true){
            if (helper==first){//说明只有一个节点
                break;
            }
            //让first和helper同时移动countNode-1次
            for (int i = 0; i < countNode-1; i++) {
                first=first.getNext();
                helper=helper.getNext();
            }
            System.out.printf("节点%d出圈 \n",first.getNo());
            //拿出环
            first=first.getNext();
            helper.setNext(first);
        }
        System.out.printf("没有出队列的节点为%d \n",helper.getNo());
    }

}
